#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
定时任务脚本，用于定期执行关键词配置的视频收集和处理任务
"""

import time
import schedule
import os
import sys
from datetime import datetime
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 添加项目根目录到Python路径
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if project_root not in sys.path:
    sys.path.append(project_root)

from utils.video_database import VideoDatabase
from processors.tikhub_downloader import TikHubDownloader


def run_keyword_task(keyword_config):
    """
    执行单个关键词任务
    
    Args:
        keyword_config: 关键词配置对象
    """
    print(f"[{datetime.now()}] 开始执行关键词任务: {keyword_config.keyword} (数量: {keyword_config.count})")
    
    try:
        # 初始化下载器
        downloader = TikHubDownloader()
        
        # 执行视频收集和处理任务
        # 使用默认语言: source_lang=zh, target_lang=vi
        result = downloader.collect_and_process_videos(
            keyword=keyword_config.keyword,
            count=keyword_config.count,
            platform=keyword_config.platform,
            source_lang=keyword_config.source_lang,
            target_lang=keyword_config.target_lang
        )
        
        # 更新最后运行时间
        db = VideoDatabase()
        db.update_keyword_last_run_time(keyword_config.keyword)
        
        if result["success"]:
            print(f"[{datetime.now()}] 关键词任务执行成功: {keyword_config.keyword}")
            print(f"  - 收集到视频数量: {len(result.get('collected_videos', []))}")
            print(f"  - 实际处理视频数量: {len(result.get('filtered_videos', []))}")
        else:
            print(f"[{datetime.now()}] 关键词任务执行失败: {keyword_config.keyword}")
            print(f"  - 错误信息: {result.get('message', '未知错误')}")
            
    except Exception as e:
        print(f"[{datetime.now()}] 执行关键词任务时出错: {keyword_config.keyword}")
        print(f"  - 错误详情: {e}")
        import traceback
        traceback.print_exc()


def check_pending_videos():
    """
    检查数据库中所有处理状态为pending的视频，并轮询鬼手API获取处理结果
    """
    print(f"[{datetime.now()}] 开始检查处理中的视频状态...")
    
    try:
        # 初始化下载器
        downloader = TikHubDownloader()
        
        # 检查处理状态
        downloader.check_processing_status()
        
        print(f"[{datetime.now()}] 视频状态检查完成")
        
    except Exception as e:
        print(f"[{datetime.now()}] 检查处理中的视频状态时出错: {e}")
        import traceback
        traceback.print_exc()


def run_scheduled_tasks():
    """
    运行所有启用的关键词任务
    """
    print(f"[{datetime.now()}] 开始执行定时任务...")
    
    try:
        # 获取数据库实例
        db = VideoDatabase()
        
        # 获取所有启用的关键词配置
        keyword_configs = db.get_keyword_configs(enabled_only=True)
        
        if not keyword_configs:
            print(f"[{datetime.now()}] 没有启用的关键词配置")
            return
        
        print(f"[{datetime.now()}] 找到 {len(keyword_configs)} 个启用的关键词配置")
        
        # 依次执行每个关键词任务
        for keyword_config in keyword_configs:
            run_keyword_task(keyword_config)
            
            # 在任务之间添加延迟，避免请求过于频繁
            time.sleep(100)
            
        print(f"[{datetime.now()}] 定时任务执行完成")
        
    except Exception as e:
        print(f"[{datetime.now()}] 执行定时任务时出错: {e}")
        import traceback
        traceback.print_exc()


def setup_scheduled_tasks():
    """
    设置定时任务
    """
    time = os.environ.get("SCHEDULE_TIME", "00:00")
    # 每天晚上12点执行任务
    schedule.every().day.at(time).do(run_scheduled_tasks)
    inteval_minutes = os.environ.get("DOWNLOAD_INTERVAL_MINUTES", 1)
    # 每1分钟检查一次处理中的视频状态（原为每10分钟）
    schedule.every(int(inteval_minutes)).minutes.do(check_pending_videos)
    
    download_path = os.environ.get("BASE_SCHEDULE_DIR", "data/videos")
    retry_interval = os.environ.get("RETRY_INTERVAL", 10)
    print("✅ 任务执行时间：", datetime.now())
    print(f"🕒 [{datetime.now()}] 定时任务已设置 ✅")
    print(f"📅 每天 {time} 执行关键词收集和处理任务 🔍")
    print(f"⏱️ 每 {inteval_minutes} 分钟检查处理中的视频状态 🎬")
    print(f"📂 下载路径: {download_path}")
    print(f"🚀 下载失败后，重试间隔时长 {retry_interval} 🚀")
    
    # 立即运行一次任务（可选）
    # run_scheduled_tasks()


def main():
    """
    主函数
    """
    print(f"[{datetime.now()}] 启动定时任务服务...")
    
    # 设置定时任务
    setup_scheduled_tasks()
    
    # 运行调度器
    while True:
        schedule.run_pending()
        time.sleep(60)  # 每分钟检查一次


if __name__ == "__main__":
    main()